With this patch, we can enable VMXAssist to bring up APs of SMP VMX
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 28 Sep 2005 13:05:58 +0000 (14:05 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 28 Sep 2005 13:05:58 +0000 (14:05 +0100)
guest. On entry to VMXAssist:
 1) %edx is the processor number, i.e. vcpu id, and for BSP it's 0.
 2) %ebx is the vector number from SIPI.
Also removed some ugly tailing space.

Signed-off-by: Xin Li <xin.b.li@intel.com>
Signed-off-by: Jun Nakajima <jun.nakajima@intel.com>
tools/firmware/vmxassist/gen.c
tools/firmware/vmxassist/head.S
tools/firmware/vmxassist/setup.c
tools/firmware/vmxassist/vmxloader.c

index 298f3f5877d6a355de57ac5a3af7a85e7bc47b86..3cdea7240f1b1eba94e46937ddac9071c158bd85 100644 (file)
@@ -23,7 +23,7 @@
 #include <vm86.h>
 
 int
-main()
+main(void)
 {
        printf("/* MACHINE GENERATED; DO NOT EDIT */\n");
        printf("#define VMX_ASSIST_CTX_GS_SEL   0x%x\n",
index 1541a1c8e9dc9fbd34f7c19fa9020c990c160df2..1410a730f0ae7a15960d7575a9a616118c0fc1e0 100644 (file)
@@ -110,6 +110,10 @@ rom_gdtr:
 _start:
        cli
 
+       /* save register parameters to C land */
+       movl    %edx, booting_cpu
+       movl    %ebx, booting_vector
+
        /* clear bss */
        cld
        xorb    %al, %al
@@ -129,7 +133,6 @@ _start:
        call    main
        jmp     halt
 
-
 /*
  * Something bad happened, print invoking %eip and loop forever
  */
index a83705f449f78b8387f3bbf6ffe54bd2c0caa263..dc253afec0cdee1715658ab4bf1cbe6b31807390 100644 (file)
@@ -29,6 +29,9 @@
 
 #define        min(a, b)       ((a) > (b) ? (b) : (a))
 
+/* Which CPU are we booting, and what is the initial CS segment? */
+int booting_cpu, booting_vector;
+
 unsigned long long gdt[] __attribute__ ((aligned(32))) = {
        0x0000000000000000ULL,          /* 0x00: reserved */
        0x0000890000000000ULL,          /* 0x08: 32-bit TSS */
@@ -201,12 +204,17 @@ enter_real_mode(struct regs *regs)
                initialize_real_mode = 0;
                regs->eflags |= EFLAGS_VM | 0x02;
                regs->ves = regs->vds = regs->vfs = regs->vgs = 0xF000;
-               regs->cs = 0xF000; /* ROM BIOS POST entry point */
+               if (booting_cpu == 0) {
+                       regs->cs = 0xF000; /* ROM BIOS POST entry point */
 #ifdef TEST
-               regs->eip = 0xFFE0;
+                       regs->eip = 0xFFE0;
 #else
-               regs->eip = 0xFFF0;
+                       regs->eip = 0xFFF0;
 #endif
+               } else {
+                       regs->cs = booting_vector << 8; /* AP entry point */
+                       regs->eip = 0;
+               }
                regs->uesp = 0;
                regs->uss = 0;
                printf("Starting emulated 16-bit real-mode: ip=%04x:%04x\n",
@@ -215,8 +223,8 @@ enter_real_mode(struct regs *regs)
                mode = VM86_REAL; /* becomes previous mode */
                set_mode(regs, VM86_REAL);
 
-                /* this should get us into 16-bit mode */
-                return;
+               /* this should get us into 16-bit mode */
+               return;
        } else {
                /* go from protected to real mode */
                regs->eflags |= EFLAGS_VM;
@@ -334,7 +342,12 @@ start_bios(void)
 {
        unsigned long cr0;
 
-       printf("Start BIOS ...\n");
+       if (booting_cpu == 0)
+               printf("Start BIOS ...\n");
+       else
+               printf("Start AP %d from %08x ...\n",
+                      booting_cpu, booting_vector << 12);
+
        initialize_real_mode = 1;
        cr0 = get_cr0();
 #ifndef TEST
@@ -345,20 +358,28 @@ start_bios(void)
 }
 
 int
-main()
+main(void)
 {
-       banner();
+       if (booting_cpu == 0)
+               banner();
+
 #ifdef TEST
        setup_paging();
 #endif
+
        setup_gdt();
        setup_idt();
+
 #ifndef        TEST
-       set_cr4(get_cr4() | CR4_VME); 
+       set_cr4(get_cr4() | CR4_VME);
 #endif
+
        setup_ctx();
-       setup_pic();
+
+       if (booting_cpu == 0)
+               setup_pic();
+
        start_bios();
+
        return 0;
 }
-
index 15aad0bf5f7ebbebdb040ea6aaec88f57759b752..2a2a17bc4f744e779ce3ed89181cc23c9f2b81ac 100644 (file)
@@ -132,11 +132,12 @@ main(void)
                 memcpy((void *)ACPI_PHYSICAL_ADDRESS, acpi, sizeof(acpi));
        }
 #endif
-                       
+
        puts("Loading VMXAssist ...\n");
        memcpy((void *)TEXTADDR, vmxassist, sizeof(vmxassist));
+
        puts("Go ...\n");
-       ((void (*)())TEXTADDR)();
+       asm volatile ( "jmp *%%eax" : : "a" (TEXTADDR), "d" (0) );
+
        return 0;
 }
-